﻿using System.Drawing;

namespace CommonStructs
{
	/// <summary>
	/// Цвета элементов диаграммы
	/// </summary>
    public static class ColorPreferences
    {
        public static Color LinkIsAColor = Color.DodgerBlue;
        public static Color LinkSubFrameColor = Color.SpringGreen;
    }

	/// <summary>
	/// Типы связей
	/// </summary>
	public enum LinkType
	{ IsA, SubFrame, Next }

	/// <summary>
	/// Состояния диаграммы. Соответствуют перечислению Behavior из MindFusion
	/// </summary>
    public enum ViewState
    { 
		Custom, 
		DoNothing, 
		Modify, 
		DrawLinks, 
		Pan 
	}

	public enum FrameType
	{
 		Object,
		Situation
	}

	/// <summary>
	/// Данные фрейма
	/// </summary>
	public struct FrameData
	{
		/// <summary>
		/// Идентификатор
		/// </summary>
		public int id;

		/// <summary>
		/// Имя фрейма
		/// </summary>
		public string name;

		/// <summary>
		/// Позиция фрейма
		/// </summary>
		public Point location;
	}

	/// <summary>
	/// Данные связи
	/// </summary>
	public struct LinkData
	{
		/// <summary>
		/// Откуда исходит дуга.
		/// is-a исходит из потомка, 
		/// subframe - из фрейма, который содержит субфрейм,
		/// next - из фрейма, который является предыдущим
		/// </summary>
		public int idFrameFrom;

		/// <summary>
		/// Куда входит дуга.
		/// is-a - во фрейм-родитель
		/// subframe - в субфрейм
		/// next - в следующий фрейм
		/// </summary>
		public int idFrameTo;

		/// <summary>
		/// Тип дуги
		/// </summary>
		public LinkType type;

		/// <summary>
		/// Имя дуги
		/// </summary>
		public string name;
	}

	/// <summary>
	/// Событие, произошедшее с фреймом
	/// </summary>
	/// <param name="frameData">Данные фрейма</param>
	public delegate void FrameEvent(FrameData frameData);

	/// <summary>
	/// Событие, произошедшее со связью
	/// </summary>
	/// <param name="linkData">Данные связи</param>
	public delegate void LinkEvent(LinkData linkData);

	/// <summary>
	/// Собитие, произошедшее со слотами фрейма (обычно - изменение слотов)
	/// </summary>
	/// <param name="frameId">Идентификатор фрейма</param>
	public delegate void FrameSlotsEvent(int frameId);

	/// <summary>
	/// Событие переименования
	/// </summary>
	/// <param name="oldName">Старое имя</param>
	/// <param name="newName">Новое имя</param>
	public delegate void RenamedEvent(string oldName, string newName);

	/// <summary>
	/// Собыите изменения дуги
	/// </summary>
	/// <param name="linkData">Данные дуги</param>
	/// <returns>Возможны ли изменения</returns>
	public delegate bool ChangeLinkEvent(LinkData linkData);

	/// <summary>
	/// Переименование фрейма
	/// </summary>
	/// <param name="frameId">Идентификатор фрейма</param>
	/// <param name="newName">Новое имя фрейма</param>
	public delegate void RenameFrame(int frameId,string newName);

	/// <summary>
	/// Простое событие без параметров
	/// </summary>
	public delegate void EmptyEvent();
}